Wir beschäftigen uns mit den Daten des Bundesamt für Meteorologie. Wir haben dafür einen Export der Wetterstation Jungfraujoch (3571 m ü.M.) vom Jahr 2020.
library(plotly)
library(corrplot)
library(lubridate)
library(tidyverse)
data_unclean <- read.csv(file = "Meteodaten.csv", sep = ";")
data_unclean <- data.frame(lapply(data_unclean, as.numeric))
data_unclean$time <- ymd_hm(data_unclean$time)
data <- data_unclean
data <- data %>%
select(time,
"Böenspitze" = fkl010z1, # in Meter/Sekunde
"Windgeschwindigkeit" = fkl010za, # in Meter/Sekunde
"Windrichtung" = dkl010za, # in Grad
"Sonnenscheindauer" = sre000z0, # in Minuten
"Gesamtbewölkung" = nto000s0, # in octas
"Luftfeuchtigkeit" = ure200s0, # in Prozent
"Lufttemperatur" = tre200s0, # in Grad Celsius
"Luftdruck" = prestas0 # in Hectopascal
) # Erweiterbar :)
# Ersetzt durch lapply
# data$Böenspitze <- as.numeric(data$Böenspitze)
# data$Windgeschwindigkeit <- as.numeric(data$Windgeschwindigkeit)
# data$Windrichtung <- as.numeric(data$Windrichtung)
# data$Sonnenscheindauer <- as.numeric(data$Sonnenscheindauer)
# data$Gesamtbewölkung <- as.numeric(data$Gesamtbewölkung)
# data$Luftfeuchtigkeit <- as.numeric(data$Luftfeuchtigkeit)
# data$Lufttemperatur <- as.numeric(data$Lufttemperatur)
# data$Luftdruck <- as.numeric(data$Luftdruck)
# data$Betrag_mittlere_Wolken <- as.numeric(data$Betrag_mittlere_Wolken)
# data$Betrag_untere_Wolken <- as.numeric(data$Betrag_untere_Wolken)
corrData <- cor(data_unclean[3:31], use = "pairwise.complete.obs")
corrplot(corrData, method = "ellipse", order = "alphabet", type = "upper", tl.pos = "lt")
Im ganzen Datensatz haben wir zu viele Variablen um eine verständliche Visualisierung über die Korrelationen aller Variablen zu erstellen. Jedoch lohnt sich diese Erstellung dieser Visualisierung um zu bestimmmen, welche Features man im reduzierten Datensatz übernehmen möchte. Das Bundesamt für Meteorologie hat die Namen dieser Variablen kodiert, deswegen müssen wir anhand der mitgelieferten Tabelle schauen, für was diese Codes stehen:
| Parameter | Einheit | Beschreibung |
|---|---|---|
| uto200s0 | g/m^2 | Absolute Luftfeuchtigkeit 2 m über Boden; Momentanwert |
| ns2000s0 | octas | Betrag der mittleren Wolken |
| ns1000s0 | octas | Betrag der untersten Wolken |
| fkl010z1 | m/s | Böenspitze (Sekundenböe); Maximum |
| xchills0 | °C | Chill Temperatur; Momentanwert |
| pva200s0 | hPa | Dampfdruck 2 m über Boden; Momentanwert |
| pvd200s0 | hPa | Dampfdruckdefizit 2 m über Boden; Momentanwert |
| tre2desd | °C | Differenz Lufttemperatur 2 m über Boden - Taupunkt; Momentanwert |
| tpp200s0 | °C | Feuchtpotentielle Temperatur 2 m über Boden; Momentanwert |
| tps200s0 | °C | Feuchttemperatur (Psychrometertemperatur) 2 m über Boden; Momentanwert |
| nto000s0 | octas | Gesamtbewölkung |
| gor000za | W/m^2 | Globalstrahlung; Standardabweichung |
| gre000z0 | W/m^2 | Globalstrahlung; Zehnminutenmittel |
| oli000z0 | W/m^2 | Langwellige Einstrahlung; Zehnminutenmittel |
| prestas0 | hPa | Luftdruck auf Barometerhöhe (QFE); Momentanwert |
| pp0qnhs0 | hPa | Luftdruck reduziert auf Meeresniveau mit Standardatmosphäre (QNH); Momentanwert |
| tre200s0 | °C | Lufttemperatur 2 m über Boden; Momentanwert |
| pvamixs0 | g/kg | Mischungsverhältnis |
| uor200s0 | % | Original Luftfeuchtigkeit 2 m über Boden; Momentanwert |
| tpo200s0 | °C | Potentielle Temperatur 2 m über Boden; Momentanwert |
| ure200s0 | % | Relative Luftfeuchtigkeit 2 m über Boden; Momentanwert |
| sre000z0 | min | Sonnenscheindauer; Zehnminutensumme |
| usp200s0 | g/kg | Spezifische Luftfeuchtigkeit 2 m über Boden; Momentanwert |
| pvaices0 | hPa | Sättigungsdampfdruck über Eis; Momentanwert |
Leider sind die meisten hohen Korrelationen keine richtige Korrelationen, sondern zwei Variablen, welche etwas ähnliches beschreiben oder physikalische Zusammenhänge. Beispiel dafür ist die Korrelation von sre000z0 (Sonnenscheindauer) und gre000z0 (Globalstrahlung).
corrData <- data %>%
select(
"Böenspitze",
"Windgeschwindigkeit",
"Windrichtung",
"Sonnenscheindauer",
"Luftfeuchtigkeit",
"Lufttemperatur",
"Luftdruck",
) %>%
cor(., use = "pairwise.complete.obs")
corrplot(corrData, method = "ellipse", order = "alphabet", type = "upper", tl.pos = "lt")
Die stärksten Korrelationen sind Windgeschwindigkeit ~ Böenspitze, LangwelligeEinstrahlung ~ Luftfeuchtigkeit und Luftdruck ~ Lufttemperatur. Mehr Text folgt… :)
granularity <- "day"
plot <- data %>%
group_by(time = floor_date(time, granularity)) %>%
summarise(
mean_Lufttemperatur = mean(Lufttemperatur, na.rm = T),
mean_Luftfeuchtigkeit = mean(Luftfeuchtigkeit, na.rm = T),
mean_Windgeschwindigkeit = mean(Windgeschwindigkeit, na.rm = T),
mean_Luftdruck = mean(Luftdruck, na.rm = T),
Sonnenscheindauer_h = sum(Sonnenscheindauer, na.rm = T) / 60
)
plot_ly(
data = plot,
type = "scatter",
mode = "lines",
width = 900,
height = 700
) %>%
add_trace(x = ~time, y = ~mean_Lufttemperatur, name = "Lufttemperatur °C") %>%
layout(
showlegend = TRUE,
title = "Wetterverlauf im Jungfraujoch über das Jahr 2020",
xaxis = list(
title = "Zeitachse",
rangeslider = list(visible = T),
rangeselector = list(
buttons = list(
list(count = 1, label = "1m", step = "month", stepmode = "backward"),
list(step = "all")
)
),
zerolinecolor = "#ffff",
zerolinewidth = 2,
gridcolor = "ffff",
type = "date"
),
yaxis = list(
title = "",
zerolinecolor = "#ffff",
zerolinewidth = 2,
gridcolor = "ffff"
),
plot_bgcolor = "#e5ecf6",
margin = 0.2
)
plot <- data %>%
group_by(time = format(time, "%H:%M")) %>%
summarise(
mean_Lufttemperatur = mean(Lufttemperatur, na.rm = T),
mean_Luftfeuchtigkeit = mean(Luftfeuchtigkeit, na.rm = T),
mean_Windgeschwindigkeit = mean(Windgeschwindigkeit, na.rm = T),
mean_Luftdruck = mean(Luftdruck, na.rm = T),
Sonnenscheindauer_h = mean(Sonnenscheindauer, na.rm = T)
)
plot_ly(
data = plot,
type = "scatter",
mode = "lines",
width = 900,
height = 700
) %>%
add_trace(x = ~time, y = ~mean_Lufttemperatur, name = "Lufttemperatur °C") %>%
add_trace(x = ~time, y = ~mean_Luftfeuchtigkeit, name = "Luftfeuchtigkeit in %", visible = "legendonly") %>%
add_trace(x = ~time, y = ~Sonnenscheindauer_h, name = "Sonnenscheindauer in h", visible = "legendonly") %>%
add_trace(x = ~time, y = ~mean_Windgeschwindigkeit, name = "Windgeschwindigkeit in m/s", visible = "legendonly") %>%
add_trace(x = ~time, y = ~mean_Luftdruck, name = "Luftdruck in hPa", visible = "legendonly") %>%
layout(
showlegend = TRUE,
title = "Durchschnittliche Temperatur über den Tag auf dem Jungfraujoch im Jahr 2020",
xaxis = list(
title = "Uhrzeit",
rangeslider = list(visible = T),
rangeselector = list(
buttons = list(
list(count = 1, label = "1m", step = "month", stepmode = "backward"),
list(step = "all")
)
),
zerolinecolor = "#ffff",
zerolinewidth = 2,
gridcolor = "ffff"
),
yaxis = list(
title = "",
zerolinecolor = "#ffff",
zerolinewidth = 2,
gridcolor = "ffff"
),
plot_bgcolor = "#e5ecf6",
margin = 0.2,
shapes = list(
type = "rect",
fillcolor = "yellow",
line = list(color = "yellow"),
opacity = 0.2,
x0 = 33.4,
x1 = 49.1,
y0 = -6.1,
y1 = -4.4
)
)
visualize <- function(granularity) {
plot <- data %>%
group_by(time = floor_date(time, granularity)) %>%
summarise(
mean_Lufttemperatur = mean(Lufttemperatur, na.rm = T),
mean_Luftfeuchtigkeit = mean(Luftfeuchtigkeit, na.rm = T),
mean_Windgeschwindigkeit = mean(Windgeschwindigkeit, na.rm = T),
mean_Luftdruck = mean(Luftdruck, na.rm = T),
Sonnenscheindauer_h = sum(Sonnenscheindauer, na.rm = T) / 60
)
plot_ly(
data = plot,
type = "scatter",
mode = "lines",
width = 900,
height = 700
) %>%
add_trace(x = ~time, y = ~mean_Lufttemperatur, name = "Lufttemperatur °C", visible = "legendonly") %>%
add_trace(x = ~time, y = ~mean_Luftfeuchtigkeit, name = "Luftfeuchtigkeit in %", visible = "legendonly") %>%
add_trace(x = ~time, y = ~Sonnenscheindauer_h, name = "Sonnenscheindauer in h") %>%
add_trace(x = ~time, y = ~mean_Windgeschwindigkeit, name = "Windgeschwindigkeit in m/s", visible = "legendonly") %>%
add_trace(x = ~time, y = ~mean_Luftdruck, name = "Luftdruck in hPa", visible = "legendonly") %>%
layout(
showlegend = TRUE,
title = "Wetterverlauf im Jungfraujoch über das Jahr 2020",
xaxis = list(
title = "Zeitachse",
rangeslider = list(visible = T),
rangeselector = list(
buttons = list(
list(count = 1, label = "1m", step = "month", stepmode = "backward"),
list(step = "all")
)
),
zerolinecolor = "#ffff",
zerolinewidth = 2,
gridcolor = "ffff"
),
yaxis = list(
title = "",
zerolinecolor = "#ffff",
zerolinewidth = 2,
gridcolor = "ffff"
),
plot_bgcolor = "#e5ecf6",
margin = 0.2
)
}
visualize("hour")
visualize("day")
visualize("week")
visualize("month")